package ar.pmt.vista.formularios;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.util.MessageResources;
import org.springframework.beans.factory.BeanFactory;

import ar.pmt.core.constantes.Constantes;
import ar.pmt.modelo.beans.Peticion;
import ar.pmt.modelo.beans.Proyecto;
import ar.pmt.modelo.businessObject.SrvcControlAvance;
import ar.pmt.vista.beans.ProduccionTareaVistaBean;
import ar.pmt.vista.beans.ProyectoBean;
import ar.pmt.vista.beansComplejos.PeticionBeanOriginal;
import ar.pmt.vista.beansComplejos.TareaBean;
import ar.pmt.vista.beansComplejos.VariablesCabeceraBean;
import ar.pmt.vista.beansComplejos.VariablesTareasBean;
import ar.pmt.vista.manager.impl.BeanVistaManager;
import ar.pmt.vista.manager.impl.TareaManager;
import ar.pmt.vista.manager.impl.VariablesCabeceraManager;


/**
 * @author gburgener
 *
 */
public class CargaHorasUnificadasForm extends AbstractValidatorForm {

	private static final long serialVersionUID = 1L;
	private LinkedHashMap<Integer, String> semanas = new LinkedHashMap<Integer, String>();
	private Collection<PeticionBeanOriginal> peticiones = new ArrayList<PeticionBeanOriginal>();
	private Collection<ProyectoBean> proyectos;
	private Integer peticionSel;
	private Integer semanaSel;
	private Integer proyectoSel;
	private String uidTareaSel;
	private String nomTareaSel;
	private Collection<Integer> idsTareas;
	private String idTareaSel;
	private Collection<Float> costosEstimados;
	private String costoSel;
	private Float valorGanadoTotal;
	private Float esfuerzoRealTotal;
	private Float esfuerzoPlanificadoTotal;
	private Collection<ProduccionTareaVistaBean> detalleAvanceProduccion;
	private Collection<TareaBean> tareas = new ArrayList<TareaBean>();
	private Collection<VariablesCabeceraBean> totalesVariablesCabecera = new ArrayList<VariablesCabeceraBean>();
	private Collection<Calendar> fechas;

	private Collection<VariablesTareasBean> totalesVriablesDetalle;
	private SrvcControlAvance srvcControlAvance;


   /**
	 * @return the costoSel
	 */
   public String getCostoSel() {
      return costoSel;
   }
   /**
    * @param costoSel the costoSel to set
    */
   public void setCostoSel(String costoSel) {
      this.costoSel = costoSel;
   }
   /**
    * @return the costosEstimados
    */
   public Collection<Float> getCostosEstimados() {
      return costosEstimados;
   }
   /**
    * @param costosEstimados the costosEstimados to set
    */
   public void setCostosEstimados(Collection<Float> costosEstimados) {
      this.costosEstimados = costosEstimados;
   }
   /**
    * @return the detalleAvanceProduccion
    */
   public Collection<ProduccionTareaVistaBean> getDetalleAvanceProduccion() {
      return detalleAvanceProduccion;
   }
   /**
    * @param detalleAvanceProduccion the detalleAvanceProduccion to set
    */
   public void setDetalleAvanceProduccion(
         Collection<ProduccionTareaVistaBean> detalleAvanceProduccion) {
      this.detalleAvanceProduccion = detalleAvanceProduccion;
   }
   /**
    * @return the esfuerzoPlanificadoTotal
    */
   public Float getEsfuerzoPlanificadoTotal() {
      return esfuerzoPlanificadoTotal;
   }
   /**
    * @param esfuerzoPlanificadoTotal the esfuerzoPlanificadoTotal to set
    */
   public void setEsfuerzoPlanificadoTotal(Float esfuerzoPlanificadoTotal) {
      this.esfuerzoPlanificadoTotal = esfuerzoPlanificadoTotal;
   }
   /**
    * @return the esfuerzoRealTotal
    */
   public Float getEsfuerzoRealTotal() {
      return esfuerzoRealTotal;
   }
   /**
    * @param esfuerzoRealTotal the esfuerzoRealTotal to set
    */
   public void setEsfuerzoRealTotal(Float esfuerzoRealTotal) {
      this.esfuerzoRealTotal = esfuerzoRealTotal;
   }
   /**
    * @return the fechaSel
    */

   /**
    * @return the idsTareas
    */
   public Collection<Integer> getIdsTareas() {
      return idsTareas;
   }
   /**
    * @param idsTareas the idsTareas to set
    */
   public void setIdsTareas(Collection<Integer> idsTareas) {
      this.idsTareas = idsTareas;
   }
   /**
    * @return the idTareaSel
    */
   public String getIdTareaSel() {
      return idTareaSel;
   }
   /**
    * @param idTareaSel the idTareaSel to set
    */
   public void setIdTareaSel(String idTareaSel) {
      this.idTareaSel = idTareaSel;
   }

   /**
    * @return the nomTareaSel
    */
   public String getNomTareaSel() {
      return nomTareaSel;
   }
   /**
    * @param nomTareaSel the nomTareaSel to set
    */
   public void setNomTareaSel(String nomTareaSel) {
      this.nomTareaSel = nomTareaSel;
   }
   /**
    * @return the peticiones
    */
   public Collection<PeticionBeanOriginal> getPeticiones() {
      return peticiones;
   }
   /**
    * @param peticiones the peticiones to set
    */
   public void setPeticiones(Collection<PeticionBeanOriginal> peticiones) {
      this.peticiones = peticiones;
   }
   /**
	 * @return the peticionSel
	 */
	public final Integer getPeticionSel() {
		return peticionSel;
	}
	/**
	 * @param peticionSel the peticionSel to set
	 */
	public final void setPeticionSel(Integer peticionSel) {
		this.peticionSel = peticionSel;
	}
	/**
	 * @return semanaSel
	 */
    public Integer getSemanaSel() {
		return semanaSel;
	}
    /**
     * @param semanaSel - la semana elegida por el usuario
     */
	public void setSemanaSel(Integer semanaSel) {
		this.semanaSel = semanaSel;
	}
/**
    * @return the uidTareaSel
    */
   public String getUidTareaSel() {
      return uidTareaSel;
   }
   /**
    * @param uidTareaSel the uidTareaSel to set
    */
   public void setUidTareaSel(String uidTareaSel) {
      this.uidTareaSel = uidTareaSel;
   }
   /**
    * @return the valorGanadoTotal
    */
   public Float getValorGanadoTotal() {
      return valorGanadoTotal;
   }
   /**
    * @param valorGanadoTotal the valorGanadoTotal to set
    */
   public void setValorGanadoTotal(Float valorGanadoTotal) {
      this.valorGanadoTotal = valorGanadoTotal;
   }
	/**
	 * @return the proyectos
	 */
	public final Collection<ProyectoBean> getProyectos() {
		return proyectos;
	}
	
	/**
	 * @return the proyectoSel
	 */
	public final Integer getProyectoSel() {
		return proyectoSel;
	}
	/**
	 * @param proyectoSel the proyectoSel to set
	 */
	public final void setProyectoSel(Integer proyectoSel) {
		this.proyectoSel = proyectoSel;
	}
	/**
	 * @param proyectos the proyectos to set
	 */
	public final void setProyectos(Collection<ProyectoBean> proyectos) {
		this.proyectos = proyectos;
	}
	/**
	 * @return semanas
	 */
	public LinkedHashMap<Integer, String> getSemanas() {
		return semanas;
	}
	/**
	 * @param semanas - setter de combo de semanas
	 */
	public void setSemanas(LinkedHashMap<Integer, String> semanas) {
		this.semanas = semanas;
	}
	public Collection<TareaBean> getTareas() {
		return tareas;
	}
	public void setTareas(Collection<TareaBean> tareas) {
		this.tareas = tareas;
	}
	public Collection<VariablesCabeceraBean> getTotalesVariablesCabecera() {
		return totalesVariablesCabecera;
	}
	public void setTotalesVariablesCabecera(
			Collection<VariablesCabeceraBean> totalesVariablesCabecera) {
		this.totalesVariablesCabecera = totalesVariablesCabecera;
	}
	public Collection<Calendar> getFechas() {
		return fechas;
	}
	public void setFechas(Collection<Calendar> fechas) {
		this.fechas = fechas;
	}
	public Collection<VariablesTareasBean> getTotalesVriablesDetalle() {
		return totalesVriablesDetalle;
	}
	public void setTotalesVriablesDetalle(
			Collection<VariablesTareasBean> totalesVriablesDetalle) {
		this.totalesVriablesDetalle = totalesVriablesDetalle;
	}
	/**
	 * @return SrvcControlAvance
	 */
	public SrvcControlAvance getSrvcControlAvance() {
		return srvcControlAvance;
	}
	/**
	 * @param srvcControlAvance
	 */
	public void setSrvcControlAvance(SrvcControlAvance srvcControlAvance) {
		this.srvcControlAvance = srvcControlAvance;
	}
	

	/**
	 * @param request
	 * @param beanFactory
	 * @throws Exception
	 */
	@Override
	public void getLoadForm(HttpServletRequest request,BeanFactory beanFactory) throws Exception {	
		obtenerServicios(beanFactory);
		obtenerComboProyectos();
		setPeticionSel(0);
	}
	
	/**
	 * @param request
	 * @param type - en que modo se ejecutara el reload
	 * @param beanFactory - referencia a la bean factory para obtener servicios y beans
	 * @throws Exception
	 */
	@Override
	public void getReLoadForm(HttpServletRequest request, int type,	BeanFactory beanFactory) throws Exception {

		switch (type) {

		case Constantes.RELOADCONSULTAR:
			
			obtenerServicios(beanFactory); //"inyecto" servicios al formulario
			obtenerComboProyectos(); // Obtener combo de proyecto
			Peticion peticionSeleccionada = obtenerComboPeticiones(); // obtener combo de peticiones

			// carga de las tareas (totales por tarea + estado de la tarea en cada dia de la peticion)
			setTareas(TareaManager.getTareas(peticionSeleccionada));

			// cabeceras dia x dia
			setTotalesVariablesCabecera(VariablesCabeceraManager.getVariablesPorDia(getTareas()));

			// cabecera Actual de Ganado, Real y Planificado (global de la peticion)
			Map<String, Float> valoresGlobalesPeticion = VariablesCabeceraManager.obtenerTotalesGeneralesPeticion(getTareas());
			setValorGanadoTotal(valoresGlobalesPeticion.get(VariablesCabeceraManager.VALOR_GANADO));
			setEsfuerzoRealTotal(valoresGlobalesPeticion.get(VariablesCabeceraManager.COSTO_REAL));
			setEsfuerzoPlanificadoTotal(valoresGlobalesPeticion.get(VariablesCabeceraManager.COSTO_PLANIFICADO));

			// armado de combo de semanas
			setSemanas(obtenerComboSemanas(peticionSeleccionada));
			 
		}

	}
	
	/**
	 * Setea los servicios necesarios para hacer llamadas al Business
	 * 
	 * @param beanFactory
	 * @throws Exception
	 */
	private void obtenerServicios(BeanFactory beanFactory) throws Exception {
		srvcControlAvance = (SrvcControlAvance)beanFactory.getBean("srvcControlAvance");
	}
	
	/**
	 * setea el atributo que representa el combo de proyecto, 
	 * pidiendole al Business los proyectos existentes
	 * @throws Exception
	 */
	private void obtenerComboProyectos() throws Exception {
		Collection<Proyecto> proyectosModel= srvcControlAvance.obtenerProyectos();
		Collection<ProyectoBean> proyectosVista= new ArrayList<ProyectoBean>();
		
		BeanVistaManager.copiarCollectionBeanModeloToBeanVista(proyectosModel, proyectosVista, ProyectoBean.class);
		
		setProyectos(proyectosVista);
	}

	/**
	 * metodo que obtiene del modelo las peticiones de un proyecto y convierte los beans de peticiones que retorna el modelo
	 * a beans de vista aptos para la jsp
	 * @return
	 * @throws Exception
	 */
	private Peticion obtenerComboPeticiones() throws Exception {
		Proyecto proyectoSel= srvcControlAvance.obtenerProyecto(getProyectoSel());
		Collection<Peticion> peticiones= proyectoSel.getPeticiones();
		Collection<PeticionBeanOriginal> peticionesBean= new ArrayList<PeticionBeanOriginal>();
		
		//TODO realizar el metodo de copiar bean de collection genericos
		Peticion peticionSeleccionada = BeanVistaManager.copiarCollectionPeticionToPeticionBean(peticiones, peticionesBean, getPeticionSel());
		
		setPeticiones(peticionesBean);
		setPeticionSel(peticionSeleccionada.getId());
		return peticionSeleccionada;
		
	}
	
	/**
	 * metodo que en base a la cantidad de dias que dura la peticion retorna un combo con la candidad de 
	 * semanas que dura la misma
	 * @param peticion Peticion
	 * @return comboSemanas LinkedHashMap<Integer, String>
	 * @throws Exception
	 */
	private LinkedHashMap<Integer, String> obtenerComboSemanas(Peticion peticion) throws Exception{
		int diasDuracionPeticion = peticion.obtenerDiasDuracionPeticion();
		Float semanas = new Float(diasDuracionPeticion/7);
		if(diasDuracionPeticion%7 != 0){
			//seteo cantidad de semanas sacando el resto y sumando uno
			semanas++;
		}
		int semanasInt = semanas.intValue();
		LinkedHashMap<Integer, String> comboSemanas = new LinkedHashMap<Integer, String>();
		String textoSemana;
		MessageResources resource = MessageResources.getMessageResources("ar.pmt.vista.recursos.ApplicationResources");
		textoSemana = resource.getMessage("pmt.cargaHoraUnificadas.semana");
		for (int i = 0; i < semanasInt; i++) {
			comboSemanas.put(new Integer(i+1), textoSemana + " " + (i+1));
			
		}
		return comboSemanas;
	}
	
}
